A program's source code can be very helpful in understanding the program's behavior. But most if not all useful computation in commercial computing systems is too complex to be recreated mentally. In particular, even highly experienced and capable software developers who are faced with creating, debugging, or enhancing a commercial computing system do not rely solely on a visual inspection of source code or on attempts to simulate software execution mentally or on paper. Instead, the developers execute the software in order to watch what it does, or what it fails to do, during execution.
To improve their understanding of the software's actions during execution, developers use tools such as debuggers, profilers, embedded print statements, and diagnostic logs, which provide additional data as the software executes. Inspection of the program can then be aided by inspecting the data provided by the tools. However, each of these software development tools also poses technical challenges, e.g., how to obtain the tool data without altering the tool-free behavior of the program being inspected, how to avoid burying the tool data in a flood of irrelevant data, and how to connect different pieces of the tool data with one another in ways that improve the developer's understanding of the program that is being inspected.